package cn.song.freight.domain.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * 定价区域映射数据对象 (DO)
 * <pre>
 * 该实体类实现定价配置与区域的多对多关联关系。
 * V3版本新增：替代原有的strategy_area_mapping表，
 * 支持一套定价配置应用于多个区域，同时一个区域可以被多套定价配置覆盖。
 *
 * 业务场景：
 * - 华东标准定价 可以应用于 江苏、浙江、上海等多个区域
 * - 偏远地区定价 可以应用于 新疆、西藏、内蒙古等多个区域
 * - 一个区域（如北京）可能同时适用于不同策略下的不同定价配置
 *
 * 数据关系：
 * - 与strategy_area_pricing表建立多对一关系
 * - 与area表建立多对一关系
 * - 实现定价配置和区域的灵活组合
 *
 * 约束规则：
 * - 同一定价配置下，同一区域只能关联一次
 * - 支持批量管理和独立管理
 *
 * @author SongRenShuo
 * @version 3.0.0
 * @since 2025-08-25
 * </pre>
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("pricing_area_mapping")
@ApiModel(description = "定价区域映射数据对象")
public class PricingAreaMappingDO {

    /**
     * 主键ID
     */
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键ID")
    private Long id;

    /**
     * 定价配置ID
     * 关联strategy_area_pricing表的主键
     */
    @TableField("pricing_id")
    @ApiModelProperty(value = "定价配置ID", required = true)
    private Long pricingId;

    /**
     * 区域ID
     * 关联area表的主键
     */
    @TableField("area_id")
    @ApiModelProperty(value = "区域ID", required = true)
    private Long areaId;

    /**
     * 创建时间
     * 记录映射关系的创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 操作人
     * 记录创建该映射关系的用户
     */
    @TableField("operator")
    @ApiModelProperty(value = "操作人", example = "admin")
    private String operator;

    // ================================
    // 业务方法
    // ================================

    /**
     * 检查映射关系是否有效
     * @return true-有效，false-无效
     */
    public boolean isValid() {
        return pricingId != null && pricingId > 0
                && areaId != null && areaId > 0;
    }

    /**
     * 获取映射关系的显示描述
     * @return 映射描述字符串
     */
    public String getMappingDescription() {
        if (!isValid()) {
            return "无效映射";
        }
        return String.format("定价配置[%d] -> 区域[%d]", pricingId, areaId);
    }

    /**
     * 创建映射关系的便捷构造方法
     * @param pricingId 定价配置ID
     * @param areaId 区域ID
     * @param operator 操作人
     * @return 映射对象
     */
    public static PricingAreaMappingDO create(Long pricingId, Long areaId, String operator) {
        PricingAreaMappingDO mapping = new PricingAreaMappingDO();
        mapping.setPricingId(pricingId);
        mapping.setAreaId(areaId);
        mapping.setOperator(operator);
        return mapping;
    }
}
